# Проект "Управление банковским счетом"

## 1. Описание задачи, план и выбранные технологии:

### Описание задачи:
Клиент банка совершает покупки в магазине или онлайн. Банк начисляет бонусы в зависимости от типа покупки (10% в магазине и 17% онлайн). В случае онлайн покупок менее 20 рублей, на счёт возвращается комиссия 10%. Также начисляются бонусы в размере 30% от суммы, если покупка превышает 300 рублей.

Нужно написать REST контроллеры:
1. Оплата покупки - GET /api/payment/{Shop|Online}/{amount}
2. Количество бонусов на счете банка - GET /api/bankAccountOfEMoney
3. Количество наличных/безналичных денег - GET /api/money


### План:
1. Создать структуру проекта, включая классы для контроллеров, сервисов и модели данных.
2. Реализовать бизнес-логику с использованием шаблона State для обработки различных типов покупок и возврата средств.
3. Написать REST-контроллеры для выполнения операций оплаты, получения количества бонусов и информации о деньгах на счете.
4. Написать тесты для проверки функционала.
5. Добавить комментарии и описания на русском языке, чтобы обеспечить понятность кода для других разработчиков.

### Выбранные технологии:
- Java 17 для реализации бизнес-логики.
- Spring Boot для создания REST-контроллеров и управления зависимостями.
- Lombok для автоматической генерации геттеров, сеттеров и других методов.
- Шаблон проектирования State для управления состоянием объектов в зависимости от типа операции.
- Rest-Assured для тестов.

## 2. Структура проекта:
```
src
├── main
│   ├── java
│   │   ├── ru.bank.paymentprocessing
│   │   │   ├── controller
│   │   │   │   ├── BankAccountController.java
│   │   │   │   └── PaymentController.java
│   │   │   ├── exception
│   │   │   │   ├── RestExceptionHandler.java
│   │   │   ├── model
│   │   │   │   ├── PaymentType.java
│   │   │   ├── service
│   │   │   │   └── PaymentService.java
│   │   │   ├── state
│   │   │   │   ├── EndState.java
│   │   │   │   ├── OnlineState.java
│   │   │   │   ├── RefundState.java
│   │   │   │   ├── RootState.java
│   │   │   │   ├── ShopState.java
│   │   │   │   └── State.java
│   │   └── resources
│   │       └── application.properties
└── test
    └── java
        └── ru.bank.paymentprocessing
            ├── BankAccountControllerTest.java
            ├── PaymentControllerEightStepsTest.java
            └── PaymentControllerTest.java
```

## 3. Зависимости:
Для разработки данного проекта необходимо иметь следующие зависимости:

1. Java 17 JDK - для компиляции и выполнения Java кода.
2. Maven - для управления зависимостями и сборки проекта.
3. Spring Boot - для создания REST-контроллеров и управления зависимостями.
4. Lombok - для удобной генерации геттеров, сеттеров и других методов.
5. Rest-Assured - для проверки корректности работы REST-контроллеров.

## 4. Для тестирования использовать следующие параметры:

Изначальная сумма в (А) = 5000 рублей.
1. Online/100
2. Shop/120
3. Online/301
4. Online/17
5. Shop/1000
6. Online/21
7. Shop/570
8. Online/700
